/**
 * 
 */
package com.yst.metho.web.application.projectversion.views;

import nextapp.echo2.app.Extent;
import nextapp.echo2.app.SplitPane;
import nextapp.echo2.app.Table;
import nextapp.echo2.app.table.TableCellRenderer;

import com.yst.metho.web.application.components.ToolbarPane;
import com.yst.metho.web.application.components.listingview.AbstractConfirmationAction;
import com.yst.metho.web.application.components.listingview.DeleteToolbarAction;
import com.yst.metho.web.application.components.listingview.IConfirmationAction;
import com.yst.metho.web.application.components.listingview.RefreshToolbarAction;
import com.yst.metho.web.application.components.listingview.ToolbarAction;
import com.yst.metho.web.application.components.table.SortableTableHeaderCellRenderer;
import com.yst.metho.web.application.projectversion.actions.wbs.CloseActivityAction;
import com.yst.metho.web.application.projectversion.actions.wbs.CloseToolbarAction;
import com.yst.metho.web.application.projectversion.actions.wbs.OpenActivityAction;
import com.yst.metho.web.application.projectversion.actions.wbs.OpenToolbarAction;
import com.yst.metho.web.application.utils.Styles;

/**
 * Ce composant represente une vue qui contient un tableau avec une barre
 * d'actions. Les actions agissent sur les lignes de la table.
 * 
 * @author perso
 * 
 */
public class ProjectWBSListingViewPane extends SplitPane
{
	/** Largeur de la table */
	private static final int LISTING_WIEW_TABLE_WIDTH = 100;

	/** Action commande utilise sur la table */
	public static final String LISTING_VIEW_TABLE_ACTION_COMMAND = "selection";

	/** style utilise pour afficher la table */
	private static final String LISTING_VIEW_TABLE_STYLE = "ListingView.Table";

	/** Hauteur par defaut de la barre d'outil */
	private static final Extent DEFAULT_TOOLBAR_HEIGHT = new Extent(32);

	/** Flag qui indique si le bouton rafraichir doit etre affiche ou non */
	private boolean mShouldDisplayRefreshButton = true;

	/** Flag qui indique si le bouton rafraichir doit etre affiche ou non */
	private boolean mShouldDisplayDeleteButton = false;

	/**
	 * Creer un nouveau composant avec les boutons par defaut present dans la
	 * bare d'outil.
	 * 
	 */
	public ProjectWBSListingViewPane()
	{
		this(true);
	}

	/**
	 * Constructeur qui permet de savoir si le bouton par defaut doit etre
	 * affiche ou pas.
	 * 
	 * @param displayRefreshBtn
	 */
	public ProjectWBSListingViewPane(boolean displayRefreshBtn)
	{
		mShouldDisplayRefreshButton = displayRefreshBtn;
	}

	public ProjectWBSListingViewPane(ProjectWBSListModel model, TableCellRenderer cellRenderer)
	{
		this(model, cellRenderer, true);
	}

	public ProjectWBSListingViewPane(ProjectWBSListModel model, TableCellRenderer cellRenderer, boolean displayRefreshBtn)
	{
		this(model, cellRenderer, true, false, null);
	}

	public ProjectWBSListingViewPane(ProjectWBSListModel model, TableCellRenderer cellRenderer, boolean displayRefreshBtn, boolean displayDeleteBtn, IConfirmationAction deleteAction)
	{
		super(SplitPane.ORIENTATION_VERTICAL, DEFAULT_TOOLBAR_HEIGHT);
		mShouldDisplayRefreshButton = displayRefreshBtn;
		mShouldDisplayDeleteButton = displayDeleteBtn;
		setStyleName(Styles.FIXED_SPLIT_PANE_STYLE);

		// mise en place de la table qui liste les donnees.
		Table table = new Table(model);
		table.setWidth(new Extent(LISTING_WIEW_TABLE_WIDTH, Extent.PERCENT));
		table.setSelectionEnabled(true);
		table.setRolloverEnabled(true);
		table.setStyleName(LISTING_VIEW_TABLE_STYLE);
		table.setActionCommand(LISTING_VIEW_TABLE_ACTION_COMMAND);
		// mise en place du renderer de la table.
		table.setDefaultRenderer(Object.class, cellRenderer);
		// mise en place du renderer des entetes de table.
		table.setDefaultHeaderRenderer(new SortableTableHeaderCellRenderer());

		// creation de la barre d'outil utilisee pour manipuler la table
		// presente dessous.
		ToolbarPane toolbar = new ToolbarPane();
		// Affichage des boutons par defaut
		if (mShouldDisplayRefreshButton)
		{
			RefreshToolbarAction defaultBtn = new RefreshToolbarAction(model);
			toolbar.add(defaultBtn);
			table.addActionListener(defaultBtn);
		}
		// Ajout de la liste des versions disponibles.
		toolbar.add(model.getVersionChoiceBox());
		toolbar.add(model.getLotChoiceBox());

		// ajout des boutons fournit par le modele.
		// for (ToolbarAction btn : model.getToolbarAction())
		ToolbarAction btn;
		for (int i = 0; i < model.getToolbarAction().size(); i++)
		{
			btn = (ToolbarAction) model.getToolbarAction().get(i);
			toolbar.add(btn);
			table.addActionListener(btn);
			table.getSelectionModel().addChangeListener(btn);
		}
		AbstractConfirmationAction defaultBtn = new CloseToolbarAction(model, new CloseActivityAction(model, model.getPrj()), table);
		toolbar.add(defaultBtn);
		table.addActionListener(defaultBtn);
		table.getSelectionModel().addChangeListener(defaultBtn);
		defaultBtn = new OpenToolbarAction(model, new OpenActivityAction(model, model.getPrj()), table);
		toolbar.add(defaultBtn);
		table.addActionListener(defaultBtn);
		table.getSelectionModel().addChangeListener(defaultBtn);

		// Affichage des boutons par defaut a la fin
		if (mShouldDisplayDeleteButton)
		{
			defaultBtn = new DeleteToolbarAction(model, deleteAction, table);
			// lotList.addActionListener(defaultBtn);
			// versionList.addActionListener(defaultBtn);
			toolbar.add(defaultBtn);
			table.addActionListener(defaultBtn);
			table.getSelectionModel().addChangeListener(defaultBtn);
		}
		add(toolbar);
		add(table);
	}
}
